package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"strings"
	"unicode/utf8"

	"go-file-perception-model/internal/config"
	"go-file-perception-model/internal/logger"
	"go-file-perception-model/internal/service"
)

// MockEmbeddingModel 模拟嵌入模型
type MockEmbeddingModel struct{}

func (m *MockEmbeddingModel) Embedding(ctx context.Context, text string) ([]float32, error) {
	// 返回一个简单的模拟向量
	return []float32{0.1, 0.2, 0.3, 0.4, 0.5}, nil
}

func (m *MockEmbeddingModel) BatchEmbedding(ctx context.Context, texts []string) ([][]float32, error) {
	// 返回简单的模拟向量
	result := make([][]float32, len(texts))
	for i := range texts {
		result[i] = []float32{0.1, 0.2, 0.3, 0.4, 0.5}
	}
	return result, nil
}

func (m *MockEmbeddingModel) Close() error {
	// 模拟关闭操作
	return nil
}

func (m *MockEmbeddingModel) GetModelInfo() map[string]interface{} {
	// 返回模型信息
	return map[string]interface{}{
		"name":    "MockEmbeddingModel",
		"version": "1.0.0",
		"dim":     5,
	}
}

func main() {
	// 初始化日志系统
	logger.InitLogger()
	
	// 创建测试配置
	cfg := &config.FileIndexConfig{
		ChunkSize:        200,
		ChunkOverlap:     20,
		MaxChunkSize:     500,
		MinChunkSize:     50,
		SemanticChunking: true,
		SummaryLength:    100,
	}

	// 创建文件处理器
	processor := service.NewFileProcessor(&MockEmbeddingModel{}, cfg)

	// 创建包含多字节字符的测试文本
	testText := `这是一个测试文本，包含中文和英文混合的内容。This is a test text with mixed Chinese and English content.

UTF-8编码支持多种语言，包括中文（简体和繁体）、日文、韩文等。UTF-8 encoding supports multiple languages, including Chinese (Simplified and Traditional), Japanese, Korean, etc.

在文本分块过程中，我们需要确保不会在多字节字符的中间截断，否则会导致乱码问题。例如，如果一个中文字符被截断，就会显示为��这样的乱码。

分块算法应该能够正确识别UTF-8字符边界，确保每个分块的开头和结尾都是完整的字符。The chunking algorithm should correctly identify UTF-8 character boundaries to ensure that the beginning and end of each chunk are complete characters.

特殊字符如表情符号😊也应该被正确处理，不应该被截断。Special characters like emoji 😊 should also be handled correctly and should not be truncated.`

	// 创建一个测试文件并测试文件处理
	fmt.Println("=== 测试语义分块文件处理 ===")
	testFile := "test_file.txt"
	err := os.WriteFile(testFile, []byte(testText), 0644)
	if err != nil {
		log.Fatalf("创建测试文件失败: %v", err)
	}
	defer os.Remove(testFile)

	fileChunks, err := processor.ProcessFile(testFile)
	if err != nil {
		log.Fatalf("文件处理失败: %v", err)
	}

	allValid := true
	for i, chunk := range fileChunks {
		fmt.Printf("文件分块 %d:\n", i+1)
		fmt.Printf("长度: %d\n", len(chunk.Content))
		fmt.Printf("内容: %q\n", chunk.Content)

		// 检查分块是否是有效的UTF-8
		if !utf8.ValidString(chunk.Content) {
			fmt.Printf("❌ 文件分块 %d 包含无效的UTF-8字符\n", i+1)
			allValid = false
		} else {
			fmt.Printf("✅ 文件分块 %d 是有效的UTF-8\n", i+1)
		}

		// 检查分块开头和结尾是否有乱码
		if strings.HasPrefix(chunk.Content, "��") || strings.HasSuffix(chunk.Content, "��") {
			fmt.Printf("❌ 文件分块 %d 开头或结尾有乱码\n", i+1)
			allValid = false
		} else {
			fmt.Printf("✅ 文件分块 %d 开头和结尾没有乱码\n", i+1)
		}
		fmt.Println("---")
	}

	if allValid {
		fmt.Println("\n🎉 语义分块测试通过！所有分块都包含有效的UTF-8字符，没有乱码问题！")
	} else {
		fmt.Println("\n❌ 语义分块测试失败！部分分块存在UTF-8字符问题。")
	}

	// 测试固定大小分块
	fmt.Println("\n=== 测试固定大小分块文件处理 ===")
	cfg.SemanticChunking = false
	processor = service.NewFileProcessor(&MockEmbeddingModel{}, cfg)

	fileChunks, err = processor.ProcessFile(testFile)
	if err != nil {
		log.Fatalf("文件处理失败: %v", err)
	}

	allValid = true
	for i, chunk := range fileChunks {
		fmt.Printf("文件分块 %d:\n", i+1)
		fmt.Printf("长度: %d\n", len(chunk.Content))
		fmt.Printf("内容: %q\n", chunk.Content)

		// 检查分块是否是有效的UTF-8
		if !utf8.ValidString(chunk.Content) {
			fmt.Printf("❌ 文件分块 %d 包含无效的UTF-8字符\n", i+1)
			allValid = false
		} else {
			fmt.Printf("✅ 文件分块 %d 是有效的UTF-8\n", i+1)
		}

		// 检查分块开头和结尾是否有乱码
		if strings.HasPrefix(chunk.Content, "��") || strings.HasSuffix(chunk.Content, "��") {
			fmt.Printf("❌ 文件分块 %d 开头或结尾有乱码\n", i+1)
			allValid = false
		} else {
			fmt.Printf("✅ 文件分块 %d 开头和结尾没有乱码\n", i+1)
		}
		fmt.Println("---")
	}

	if allValid {
		fmt.Println("\n🎉 固定大小分块测试通过！所有分块都包含有效的UTF-8字符，没有乱码问题！")
	} else {
		fmt.Println("\n❌ 固定大小分块测试失败！部分分块存在UTF-8字符问题。")
	}

	fmt.Println("\n测试完成！")
}